<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise 是异步编程的一种解决方案

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。

    // Promise实例化对象(Promise 实例/对象)  => 有构造函数Promise创建的对象 
    // Promise的状态
    // pending   进行中  
    // fulfilled / resolved 已成功
    // rejected  已失败

    // 注：可以把Promise看成是状态机，当该Promise对象创建出来之后，其状态就是进行中，然后通过程序来控制到底是执行已完成，还是执行已失败。(用户可以提前决定 已成功 已失败)

    // Promise在创建过程中,提供了两个方法 resolve()  reject()
    // resolve()  将Promise实例的状态由 pending 改为 fulfilled
    // reject()   将Promise实例的状态由 pending 改为 rejected
    // resolve()  reject() 还可以传入一个参数 作为Promise对象中存的数数据

    // Promise对象有以下两个特点。

    // （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。这也是Promise这个名字的由来，它的英语意思就是“承诺”，表示其他手段无法改变。

    // 2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）

    // 注意，为了行文方便，本章后面的resolved统一只指fulfilled状态，不包含rejected状态。



    // Promise对象(p) 的拓展方法   

    // then(callback1,callback2)   => p.then()  提前规定好了 Promise实例状态改变时要执行的 内容()
    // callback1  当Primise实例/对象的状态 由进行中(pending) 改为 已成功(fulfilled) => 执行callback1
    // callback2  当Primise实例/对象的状态 由进行中(pending) 改为 已失败(rejected)   => 执行callback2

    // callback1()  callback2()  都有一个形参用于接收 Promise对象中存储的数据 

    debugger;
    var p = new Promise(function (resolve, reject) {
        debugger;
        // 此函数  就是所谓的容器 => 里面存放着未来才会结束的操作 (异步代码)
        // 此函数  中的代码也是在主线程执行
        setTimeout(function () {
            debugger;
            var num = Math.random();
            if (num >= 0.5) {
                resolve(num);  // 不拖堂
            } else {
                reject(num);     //  拖堂
            }
            console.log("异步代码执行完毕", p);
        }, 5000);
    });
    console.log(p);  // {pending}

    p.then(function (data) {
        debugger;
        console.log("已成功:说不拖就不拖", data);
    }, function (data) {
        debugger;
        console.log("已失败:该拖还要拖,学习使我快乐!", data);
    });




</script>

</html>